package juc.cas;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @ClassName UnsafeFactory
 * @PackageName juc.cas
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/29 上午10:06
 * @Version 1.0
 */
public class UnsafeFactory {

    /**
     * 获取Unsafe实例对象
     * 通过反射方式获取Unsafe类中的theUnsafe字段值
     *
     * @return Unsafe实例对象，如果获取失败则返回null
     */
    public static Unsafe getUnsafe() {
        try {
            // 通过反射获取theUnsafe字段并设置为可访问
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            return (Unsafe) field.get(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取指定类中字段的偏移量
     * 使用Unsafe对象获取指定字段在对象内存布局中的偏移地址
     *
     * @param unsafe    Unsafe实例对象
     * @param clazz     包含目标字段的类
     * @param fieldName 目标字段名称
     * @return 字段在对象中的偏移量
     * @throws Error 当指定字段不存在时抛出错误
     */
    public static long getFieldOffset(Unsafe unsafe, Class<?> clazz, String fieldName) {
        try {
            // 获取字段偏移量
            return unsafe.objectFieldOffset(clazz.getDeclaredField(fieldName));
        } catch (NoSuchFieldException e) {
            throw new Error(e);
        }
    }


}
